package server.domein;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

import core.domein.TCPDataListener;
import core.net.TCPClient;
import core.net.TCPServer;
/**
 * Klasse die request en answers geeft, alsook tekst doorstuurt
 * @author Van Wayenbergh David
 *
 */
public class ChatController implements TCPDataListener
{
	private TCPServer server;
	private ChatListener listener;
	private Map < TCPClient,String> nickList= new HashMap<TCPClient,String>();
	public ChatController()
	{
		server = new TCPServer(1234);
		ExecutorService threadExecutor = Executors.newFixedThreadPool(1);
		threadExecutor.execute(server);
		server.addTCPDataListener(this);
	}
	
	/**
	 * methode voor het versturen van gegevens
	 * @param data de te versturen data
	 */
	public void sendData(Object data)
	{
		server.sendDataToAll(data);
	}
	
	/**
	 * methode voor het toevoegen van een listener
	 * @param listener de toe te voegen listener
	 */
	public void addChatListener(ChatListener listener)
	{
		this.listener = listener;
	}
	/**
	 * methode voor het afhandelen van requests en doorsturen van data
	 * @param source de client dat de data verstuurde
	 * @param data bevat tekst of een request
	 */
	public void dataReceived(TCPClient source, Object data)
	{
		String message,name;
		message = data.toString();
		if (message.startsWith("(rn)"))
		{
			// afhandeling aanvragen naam
			name = message.substring(4);
			if (!nickList.containsValue(name))
			{
				nickList.put( source,name);
				listener.dataReceived("client " + name + " connected\n");
				server.sendDataToClient(source, "(an)good");
				server.sendDataToAllButClient("new user " + name, source);
				ArrayList<String> gebruikers = new ArrayList<String>();
				for(Map.Entry<TCPClient, String> eenEntry: nickList.entrySet())
				{
					gebruikers.add(eenEntry.getValue());
				}
				server.sendDataToAll(gebruikers);
			}
			else
				server.sendDataToClient(source, "(an)bad");
		}
		else
		{
			if (message.startsWith("(RI)"))
			{
				name = message.substring(4);
				TCPClient client=null;
				for(Map.Entry<TCPClient, String> eenEntry: nickList.entrySet())
				{
					if(eenEntry.getValue().toString().equals(name.toString()))
						client = eenEntry.getKey();
				}
				server.sendDataToClient(source, "(AI)" + client.getIP());
			}
			else
			{
				if (message.startsWith("(AD)"))
				{
					name = message.substring(4);
					String[] parameters = name.split(":");
					name = parameters[0];
					System.out.println(name + parameters[1]);
					TCPClient toSend = null;
					for(Map.Entry<TCPClient, String> eenEntry: nickList.entrySet())
					{
						if(eenEntry.getValue().toString().equals(name.toString()))
							toSend = eenEntry.getKey();
					}
					server.sendDataToClient(toSend, "(AD)"+nickList.get(source) + ":"+parameters[1]);
				}
				else
				{
					if (message.startsWith("(RD)"))
					{
						name = message.substring(4);
						TCPClient toSend = null;
						for(Map.Entry<TCPClient, String> eenEntry: nickList.entrySet())
						{
							if(eenEntry.getValue().toString().equals(name.toString()))
								toSend = eenEntry.getKey();
						}
						server.sendDataToClient(toSend, "(RD)"+nickList.get(source));
					}
					else
					{
						if (message.startsWith("(SC)"))
						{
							source.exit();
							listener.dataReceived("Client " + nickList.get(source) + " disconnected\n");
							nickList.remove(source);
							ArrayList<String> gebruikers = new ArrayList<String>();
							for(Map.Entry<TCPClient, String> eenEntry: nickList.entrySet())
							{
								gebruikers.add(eenEntry.getValue());
							}
							server.sendDataToAll(gebruikers);
						}
						else
						{
						listener.dataReceived("Data Received: " + data.toString()+ " from "+ nickList.get(source)+"\n");
						server.sendDataToAllButClient(nickList.get(source) + ">>> " + data, source);
						}
					}
				}
			}
		}
	}
	public void clientConnected(TCPClient client)
	{
	}
	/**
	 * methode voor het afsluiten van een client
	 * @param client dat stopt met het programma
	 */
	public void clientDisconnected(TCPClient client)
	{
		client.exit();
		server.disconnectClient(client);
	}
}
